package work;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Test01 {
    //题目1：多线程文件复制工具
    //需求:实现一个多线程文件复制工具，将一个大文件夹分割为多个部分，由多个线程同时复制不同部分，最终合并为完整文件夹。
    //要求:
    //1.目标文件夹里有多少个文件，就要自动创建多少个线程进行复制
    //2.每个线程负责读取源文件的一个文件，并写入目标文件夹的对应位置。
    //3.所有线程复制完成后，输出“复制完成”及总耗时。
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        //创建源文件
        File srcFile = new File("day11-code/src/thread/");
        File destFile = new File("day11-code/src/bao");
        copyTo(srcFile,destFile);
        long end = System.currentTimeMillis();
        //使用BufferedInputStream耗时 5
        //使用BufferedReader耗时 8
        System.out.println("复制完成，总耗时："+(end-start));

    }

    //总操作
    public static void copyTo(File src,File dest) {
        if (!src.exists()) {
            System.out.println("源文件不存在");
            return;
        }
        dest.mkdirs();//确保目标目录存在
        List<Thread> threads = new ArrayList<>();//创建线程集合
        //传入源文件和目标目录
        createThread(src, dest, threads);
        //启动所有线程
        for (Thread thread : threads) {
            thread.start();
        }
        //等待所有线程执行完毕
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //创建线程
    public static void createThread(File src,File dest,List<Thread> threads) {
        File[] files = src.listFiles();//获取源目录下的所有文件
        if (files == null) return;//源目录为空
        for (File child : files) {//循环遍历
            if (child.isFile()){
                File destFile = new File(dest, child.getName());//将源文件名作为目标文件名拼接到目标目录下
                Thread thread = new Thread(() -> {
                    copyFile(child, destFile);
                });
                threads.add(thread);//添加线程
            }
            else {
                File destFile = new File(dest, child.getName());//将源文件名作为目标文件名拼接到目标目录下
                destFile.mkdirs();//创建目录
                createThread(child, destFile,threads);
            }
        }
    }
    //复制操作
    public static void copyFile(File src,File dest) {
        try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest))) {
            byte[] buffer = new byte[8192];//创建缓冲区
            int len;
            while ((len = bis.read(buffer)) != -1){//循环读取
                bos.write(buffer,0,len);//输出
                bos.flush();//刷新
            }
        }catch (IOException e){//捕获异常
            e.printStackTrace();
        }
    }

    public static void copyFileReader(File src, File dest){
        try (BufferedReader br = new BufferedReader(new FileReader(src));
             BufferedWriter bw = new BufferedWriter(new FileWriter(dest))){
            String line;
            while ((line = br.readLine()) != null){
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
